//
//  XmlHelper.h
//  XmlHelper
//
//  Created by zhengbw on 11-6-28.
//  Copyright 2011年 wellhope. All rights reserved.
//

#import <Foundation/Foundation.h>

//==============================================================================
// Xml解析类

@interface XmlHelper : NSObject
{
    void                *_xmlKit;		// XmlKit实例指针
    NSStringEncoding    _encoding;		// 编解码方式
}

@property (nonatomic, assign) NSStringEncoding encoding;

//==============================================================================
#pragma mark - 初始化

- (instancetype)initWithEncoding:(NSStringEncoding)encoding;

+ (XmlHelper *)xmlHelperWithEncoding:(NSStringEncoding)encoding;

//==============================================================================
#pragma mark - 复位

// 复位
- (void)reset;

//==============================================================================
#pragma mark - 文件操作

// 从文件加载XML
- (void)loadFile:(NSString *)filename;
// 存盘XML到文件
- (BOOL)saveFile:(NSString *)filename;

//==============================================================================
#pragma mark - 定位操作，如果定位失败，保持当前位置不变

// 定位到根节点
- (void)root;

// 定位到父节点
- (BOOL)parent;

// 定位到子节点
- (BOOL)child;
// 根据节点名称定位子节点
- (BOOL)child:(NSString *)name;
// 根据节点名称/属性名称/属性值定位子节点
- (BOOL)child:(NSString *)name key:(NSString *)key value:(NSString *)value;

// 定位到下一个相邻节点
- (BOOL)next;
- (BOOL)next:(NSString *)name;

// 根据名称从根节点开始查找，定位第一个节点
- (BOOL)seek:(NSString *)name;

// 根据名称和文本从根节点开始查找，定位第一个节点
- (BOOL)seek:(NSString *)name text:(NSString *)text;

// 根据属性名称和属性值，从根节点开始查找，定位第一个节点
- (BOOL)seekByAttribute:(NSString *)key value:(NSString *)value;

//==============================================================================
#pragma mark - 解析操作

// 解析从文件加载的XML
- (BOOL)parse;

// 缓冲区XML解析
//	xmlString	-- 待解码xml字符串，空结尾
- (BOOL)parse:(NSString *)xmlString;

// 获取当前节点的XML字符串
//	header 是否输出XML头<?xml version="1.0" encoding="GB2312" ?>，只对根节点有效
- (NSString *)xmlString:(BOOL)header;

// 获取当前节点的所有子节点的XML字符串
- (NSString *)childrenXml;

// 判断是否存在子节点
- (BOOL)existChild;
- (BOOL)existChild:(NSString *)name;

// 获取子节点数目
- (NSInteger)childrenCount;
- (NSInteger)childrenCount:(NSString *)name;

// 获取当前节点名称
//	buf		-- 接收数据缓冲区(长度由调用者保证)
- (NSString *)name;

// 获取当前节点属性
- (NSString *)attrStringValue:(NSString *)name;
- (NSInteger)attrIntegerValue:(NSString *)name;
- (NSUInteger)attrUIntegerValue:(NSString *)name;

// 获取当前节点文本
- (NSString *)text;

// 获取当前节点整型数值
- (NSInteger)integerValue;
- (NSUInteger)unsignedIntegerValue;

// 获取当前节点的子节点文本或整型数
//	name	-- 子节点名称
- (NSString *)childText:(NSString *)name;

// 获取当前节点的子节点整型数值
- (NSInteger)childIntegerValue:(NSString *)name;
- (NSUInteger)childUIntegerValue:(NSString *)name;

//==============================================================================
#pragma mark - XML 封装操作

// 设置XML头，默认为 1.0, gb2312
- (void)setXmlHeader:(NSString *)version encoding:(NSString *)encoding;

// 添加子节点
//	toChild		-- 定位到新添加的子节点
//	name		-- 子节点名称
//	text		-- 子节点文本
//	value		-- 整型子节点内容
// 注：设置了文本的节点不能再添加子节点
- (BOOL)addChild:(BOOL)toChild name:(NSString *)name;
- (BOOL)addChild:(BOOL)toChild name:(NSString *)name text:(NSString *)text;
- (BOOL)addChild:(BOOL)toChild name:(NSString *)name value:(NSInteger)value;

// 添加文本非空子节点
//	toChild		-- 定位到新添加的子节点
//	name		-- 子节点名称
//	text		-- 子节点文本(不为空)
- (BOOL)addChildNE:(BOOL)toChild name:(NSString *)name text:(NSString *)text;

// 添加非零整型子节点
//	toChild		-- 定位到新添加的子节点
//	name		-- 子节点名称
//	nValue		-- 子节点整型值(不为零)
- (BOOL)addChildNZ:(BOOL)toChild name:(NSString *)name value:(NSInteger)value;

// 添加带属性的子节点
//	toChild		-- 定位到新添加的子节点
//	name		-- 子节点名称
//	text		-- 子节点文本
//	attrName	-- 属性名称
//	attrText	-- 属性文本
// 注：设置了文本的节点不能再添加子节点
- (BOOL)addAttrChild:(BOOL)toChild
                name:(NSString *)name 
                text:(NSString *)text
            attrName:(NSString *)attrName 
            attrText:(NSString *)attrText;

// 添加当前节点属性
- (BOOL)addAttribute:(NSString *)name text:(NSString *)text;
- (BOOL)addAttribute:(NSString *)name value:(NSInteger)value;

// 设置当前节点属性
- (BOOL)setAttribute:(NSString *)name text:(NSString *)text;
- (BOOL)setAttribute:(NSString *)name value:(NSInteger)value;

// 设置当前节点文本
- (BOOL)setText:(NSString *)text;

// 设置子节点文本
- (BOOL)setChildText:(NSString *)name text:(NSString *)text;

// 删除当前节点
- (BOOL)remove;

//==============================================================================
#pragma mark - 是否紧缩空格

- (void)condenseWSpace:(BOOL)condense;

@end
